# 编译器设置
CC = gcc
CXX = g++

# 项目名称
TARGET = app

# 自动查找所有源文件
C_SRCS = $(wildcard *.c)
CPP_SRCS = $(wildcard *.cpp)
SRCS = $(C_SRCS) $(CPP_SRCS)

# 生成对象文件列表
C_OBJS = $(C_SRCS:.c=.o)
CPP_OBJS = $(CPP_SRCS:.cpp=.o)
OBJS = $(C_OBJS) $(CPP_OBJS)

# 编译选项
CFLAGS_COMMON = -Wall -Wextra
CXXFLAGS_COMMON = -Wall -Wextra

# Debug模式（默认）
CFLAGS_DEBUG = $(CFLAGS_COMMON) -g -O0 -DDEBUG
CXXFLAGS_DEBUG = $(CXXFLAGS_COMMON) -g -O0 -DDEBUG
LDFLAGS_DEBUG = 

# Release模式（静态编译）
CFLAGS_RELEASE = $(CFLAGS_COMMON) -O2 -DNDEBUG
CXXFLAGS_RELEASE = $(CXXFLAGS_COMMON) -O2 -DNDEBUG
LDFLAGS_RELEASE = -static

# 默认模式为debug
MODE ?= debug

# 根据模式选择编译选项
ifeq ($(MODE), release)
    CFLAGS = $(CFLAGS_RELEASE)
    CXXFLAGS = $(CXXFLAGS_RELEASE)
    LDFLAGS = $(LDFLAGS_RELEASE)
    TARGET_NAME = $(TARGET)
else
    CFLAGS = $(CFLAGS_DEBUG)
    CXXFLAGS = $(CXXFLAGS_DEBUG)
    LDFLAGS = $(LDFLAGS_DEBUG)
    TARGET_NAME = $(TARGET)
endif

# 默认目标
.PHONY: all
all: $(TARGET_NAME)

# Debug构建
.PHONY: debug
debug:
	@$(MAKE) MODE=debug

# Release构建（静态编译）
.PHONY: release
release:
	@$(MAKE) MODE=release

# 链接目标文件
$(TARGET_NAME): $(OBJS)
	@echo "链接 $(MODE) 模式: $@"
	$(CXX) $(OBJS) $(LDFLAGS) -o $@
	@echo "构建完成: $@"

# 编译C源文件
%.o: %.c
	@echo "编译 $(MODE) 模式: $<"
	$(CC) $(CFLAGS) -c $< -o $@

# 编译C++源文件
%.o: %.cpp
	@echo "编译 $(MODE) 模式: $<"
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 清理
.PHONY: clean
clean:
	@echo "清理构建文件..."
	rm -f $(OBJS) $(TARGET) $(TARGET)
	@echo "清理完成"

# 显示帮助信息
.PHONY: help
help:
	@echo "可用的make目标:"
	@echo "  make          - 编译debug模式（默认）"
	@echo "  make debug    - 编译debug模式"
	@echo "  make release  - 编译release模式（静态链接）"
	@echo "  make clean    - 清理所有构建文件"
	@echo "  make help     - 显示此帮助信息"

# 显示当前设置
.PHONY: info
info:
	@echo "当前构建模式: $(MODE)"
	@echo "目标文件: $(TARGET_NAME)"
	@echo "源文件: $(SRCS)"
	@echo "对象文件: $(OBJS)"
	@echo "CFLAGS: $(CFLAGS)"
	@echo "CXXFLAGS: $(CXXFLAGS)"
	@echo "LDFLAGS: $(LDFLAGS)"


#make              # 编译debug模式（默认）
#make debug        # 编译debug模式
#make release      # 编译release模式（静态链接）
#make clean        # 清理所有构建文件
#make help         # 显示帮助信息
#make info         # 显示当前构建配置
